package com.bit.cfdi.web.vm.negocio;

import java.util.List;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;

import com.bit.cfdi.web.domain.Negocio;
import com.bit.cfdi.web.domain.Usuario;
import com.bit.cfdi.web.domain.UsuarioNegocio;
import com.bit.cfdi.web.services.NegocioService;
import com.bit.cfdi.web.services.UsuarioNegocioService;
import com.bit.cfdi.web.session.SessionUtils;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ConfigurarNombreViewModel {

	private Logger log = LogManager.getLogger(this.getClass().getName());
	
	@WireVariable private SessionUtils sessionUtils;
	@WireVariable private NegocioService negocioService;
	@WireVariable private UsuarioNegocioService usuarioNegocioService;
	
	//To show in form
	private String nombreNegocio;
	private String nombreNegocioError;
	
	@Init
	public void init() {
		nombreNegocio = ((Negocio) sessionUtils.getFromSession(
				SessionUtils.NEGOCIO)).getNombre();
	}
	
	//Getters-Setters
	public String getNombreNegocio() {
		return nombreNegocio;
	}
	
	@NotifyChange({"nombreNegocio","nombreNegocioError"})
	public void setNombreNegocio(final String nombreNegocio) {
		this.nombreNegocio = nombreNegocio;
		nombreNegocioError = null;
	}
	
	public String getNombreNegocioError() {
		return nombreNegocioError;
	}
	
	//Local Commands
	@Command @NotifyChange({"nombreNegocioError"})
	public void saveNombreNegocio() {
		log.info("Saving nombre de negocio");
		if(!validateName()) {
			nombreNegocioError = "El nombre de negocio ya está ocupado " +
					"por otro negocio";
			return;
		}
		Negocio negocio = (Negocio) sessionUtils.getFromSession(
				SessionUtils.NEGOCIO);
		negocio.setNombre(nombreNegocio);
		negocioService.save(negocio);
		log.info("Calling negocio refresh negocio info from nav component");
		updateMessage();
		BindUtils.postGlobalCommand(null, null, "negocioRefreshNegocioInfo", 
				null);
	}
	
	//private methods
	private boolean validateName() {
		Usuario usuario = (Usuario) sessionUtils.getFromSession(
				SessionUtils.USUARIO);
		List<UsuarioNegocio> usuarioNegocios = usuarioNegocioService
				.getNegociosFromUsuario(usuario);
		for(UsuarioNegocio current : usuarioNegocios) {
			if(current.getNegocio().getNombre().equals(nombreNegocio)) {
				return false;
			}
		}
		return true;
	}
	
	private void updateMessage() {
		Messagebox.show("Los datos se guardaron correctamente");
	}
}
